package jsp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * @author 石小俊
 * @date 2023年07月03日 14:46
 */
@WebServlet("*.cookie")
public class CookieServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getServletPath();
        if("/add.cookie".equals(path)){
            addCookie(request,response);
        }
        if("/findAll.cookie".equals(path)){
            findAll(request,response);
        }
        if("/modify.cookie".equals(path)){
            modifyCookie(request,response);
        }
        if("/delete.cookie".equals(path)){
            deleteCookie(request,response);
        }
    }
    protected void addCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 创建一个Cookie对象
        // Cookie(String name, String value)
        // 此时可以发现,其值必须是一个字符串
        Cookie cookie = new Cookie("username","admin");
        Cookie cookie2 = new Cookie("password","123456");
        // 对于中文,Cookie只支持指定字符集的中文。例如:ISO-8859-1
        // 因此,如果想要存储中文,必须经过处理
        // Java提供了对应的处理工具
        // Cookie cookie3 = new Cookie("name","管理员");
        // 参数一:需要存储的中文字符串
        // 参数二:当前字符串的字符集
        // 返回值:返回Cookie支持的字符集的字符串
        // 转换之后可以正常存储,会以Cookie支持的字符集进行存储
        String name = URLEncoder.encode("管理员","UTF-8");
        Cookie cookie3 = new Cookie("name",name);
        // 将创建的cookie添加到响应对象中
        response.addCookie(cookie);
        response.addCookie(cookie2);
        response.addCookie(cookie3);
    }

    protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 取出请求中所有的Cookie数据
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie : cookies){
            // 此时获取的是存储到Cookie中的原始数据,使用的是Cookie支持的字符集
            // System.out.println(cookie.getName()+":"+cookie.getValue());
            // 如果想要获取到原始字符集的数据,需要通过URLDecoder进行获取
            System.out.println(cookie.getName()+":"+URLDecoder.decode(cookie.getValue(),"UTF-8"));
        }
    }

    protected void modifyCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 在Cookie中,没有修改方法,但是能够实现修改的功能
        // 当存储Cookie数据的时候,如果指定key的数据已经存在,会覆盖原来的数据
        // 通过这种方式,实现修改操作
        Cookie cookie = new Cookie("username","alice");
        Cookie cookie2 = new Cookie("password","111111");
        response.addCookie(cookie);
        response.addCookie(cookie2);
    }

    protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 在Cookie中,可以设置指定Cookie的生存时间,当超出生存时间之后,cookie自动移除
        Cookie cookie = new Cookie("username","jack");
        // 指定cookie生存时间,单位:秒
        cookie.setMaxAge(10);
        Cookie cookie2 = new Cookie("password","222222");
        // 当生存时间设置为0,即表示删除指定的cookie
        // 由于当key的值相同时,会覆盖原来的cookie
        // 因此,如果需要删除某一个cookie,只需要添加一个新的cookie
        // 该cookie的key与需要删除的cookie的key相同即可,其值无所谓
        cookie2.setMaxAge(0);
        response.addCookie(cookie);
        response.addCookie(cookie2);
    }


}
